/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.event.data.SortEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetallePedidoOp;
import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenPedido;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioDetallePedidoOp;
import pe.com.cotelasa.scp.dominio.service.IServicioFacturaProforma;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.DetallePedidoFp;
import pe.com.cotelasa.scp.entidad.DetallePedidoOp;
import pe.com.cotelasa.scp.entidad.FacturaProforma;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Esparza
 */
@Named(value = "MBOrdenPedido")
@Scope("request")
public class MBOrdenPedido extends MBGenerico implements IMantenedor, Serializable {

    private static Logger logger = Logger.getLogger(MBFacturaProforma.class);
    @Inject
    private BKOrdenPedido bkOrdenPedido;
    @Inject
    private BKDetallePedidoOp bkDetallePedidoOp;
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Inject
    private IServicioCliente servicioCliente;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioFacturaProforma servicioFacturaProforma;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Inject
    private IServicioDetallePedidoOp servicioDetallePedidoOp;
    @Inject
    private IServicioIgv servicioIGV;
    private String URL;
    private String tipoOrdenPedido = "2";
    @Autowired
    BKSession session;

    public void buscarListaOrdenesPedido() {
        try {
            OrdenPedido ordenP = bkOrdenPedido.getOrdenPedidoBusqueda();
            ordenP.setIdEmpresa(session.getEmpresa());
            bkOrdenPedido.setListaOrdenPedidoActivos(this.servicioOrdenPedido.listarOrdenPedidosPorFiltro(ordenP, bkOrdenPedido.getFechaInicio(), bkOrdenPedido.getFechaFinal()));
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrarMantenimiento() {
        bkOrdenPedido.setOrdenPedidoBusqueda(new OrdenPedido());
        bkOrdenPedido.getOrdenPedidoBusqueda().setCodigoOrdenPedido("");
        bkOrdenPedido.getOrdenPedidoBusqueda().setEstadoPedido("");
        bkOrdenPedido.getOrdenPedidoBusqueda().setClienteMarca(new Cliente());
        bkOrdenPedido.getOrdenPedidoBusqueda().getClienteMarca().setRazonSocial("");
        bkOrdenPedido.getOrdenPedidoBusqueda().setColeccionNombre("");
        bkOrdenPedido.getOrdenPedidoBusqueda().setTipoOp('%');
        //bkOrdenPedido.setEmpresaFormulario(session.getEmpresa());
        //try {
        //bkOrdenPedido.setListaClientesActivos(servicioCliente.listarClientesActivos());
        bkOrdenPedido.setListaOrdenPedidoActivos(null);
        /*} catch (ServiceException e) {
         logger.error(e.getMessage(), e);
         mostrarError("Ocurrio un error al cargar la informacion.");
         }*/
        return URLPaginacion.OrdenPedido.URL_LISTA_ORDEN_PEDIDO;
    }

    @Override
    public String nuevo() {
        this.bkOrdenPedido.setComando(new ComandoGuardar(this));
        bkOrdenPedido.setOrdenPedidoFormulario(new OrdenPedido());
        bkOrdenPedido.getOrdenPedidoFormulario().setIdEmpresa(session.getEmpresa());
        bkOrdenPedido.setClienteMarca(new Cliente());

        bkDetallePedidoOp.inicializarValores();

        bkOrdenPedido.getOrdenPedidoFormulario().setIdCliente(new Cliente());
        bkOrdenPedido.getOrdenPedidoFormulario().setClienteMarca(new Cliente());
        bkOrdenPedido.getOrdenPedidoFormulario().setEstadoPedido("E");
        bkOrdenPedido.getOrdenPedidoFormulario().setCantidadTotalProductos(BigDecimal.ZERO);
        bkOrdenPedido.getOrdenPedidoFormulario().setPesoTotal(BigDecimal.ZERO);
        bkOrdenPedido.getOrdenPedidoFormulario().setMontoTotal(BigDecimal.ZERO);
        bkOrdenPedido.setFacturaProformaFormulario(new FacturaProforma());

        if (getTipoOrdenPedido().equals("1")) {
            bkOrdenPedido.getOrdenPedidoFormulario().setTipoOp('P');
            URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_PRENDA;
        } else {
            bkOrdenPedido.getOrdenPedidoFormulario().setTipoOp('T');
            URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_TELA;
        }
        inicializarValores();
        return URL;
    }

    @Override
    public String guardar() {
        try {
            generarCodigo();
            OrdenPedido ordenP = bkOrdenPedido.getOrdenPedidoFormulario();
            ordenP.setUsrCreacion(session.getUsuario().getUsuario());
            ordenP.setFecCreacion(new Date());
            ordenP.setId(null);
            for (DetallePedidoOp det1 : bkDetallePedidoOp.getListaDetallePedidoOP()) {
                det1.setId(null);
                det1.setIdOrdenPedido(ordenP);
            }

            ordenP.setDetallePedidoOpCollection(new ArrayList<DetallePedidoOp>());

            ordenP.getDetallePedidoOpCollection().addAll(bkDetallePedidoOp.getListaDetallePedidoOP());

            servicioOrdenPedido.guardarOrdenPedido(ordenP);

            mostrarMensaje("Se guardo la Orden de Producción satisfactoriamente.");
            bkOrdenPedido.setOrdenPedidoFormulario(ordenP);
            URL = editar();

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
            mostrarError("Ocurrio un error al cargar la informacion.");
            URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_TELA;
        }

        return URL;
    }

    @Override
    public String editar() {
        this.bkOrdenPedido.setComando(new ComandoActualizar(this));

        bkDetallePedidoOp.inicializarValores();
        inicializarValores();
        try {
            bkOrdenPedido.setOrdenPedidoFormulario(servicioOrdenPedido.conseguirOrdenPedidoPorId(bkOrdenPedido.getOrdenPedidoFormulario().getId()));
            System.out.println("moneda: " + bkOrdenPedido.getOrdenPedidoFormulario().getIdFacturaProforma().getIdTipoMoneda().getId());

            Collection<DetallePedidoOp> listaEncontrada = bkOrdenPedido.getOrdenPedidoFormulario().getDetallePedidoOpCollection();

            //bkDetallePedidoOp.setListaDetallePedidoOPEditar((List<DetallePedidoOp>) bkOrdenPedido.getOrdenPedidoFormulario().getDetallePedidoOpCollection());
            if (listaEncontrada != null || listaEncontrada.size() > 0) {
                for (DetallePedidoOp det1 : listaEncontrada) {
                    System.out.println("articulo: " + det1.getIdArticulo());
                    if (det1.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        bkDetallePedidoOp.getListaDetallePedidoOP().add(det1);
                        bkDetallePedidoOp.getListaDetallePedidoOPEditar().add(det1);
                    }
                }
            }
            if (bkOrdenPedido.getOrdenPedidoFormulario().getTipoOp() == 'P') {
                URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_PRENDA;
            } else {
                URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_TELA;
            }

            bkDetallePedidoOp.setListaDetallePedidoFP(new ArrayList<DetallePedidoFp>());
            bkDetallePedidoOp.getListaDetallePedidoFP().addAll(bkOrdenPedido.getOrdenPedidoFormulario().getIdFacturaProforma().getDetallePedidoFpCollection());

        } catch (ServiceException e) {

            if (bkOrdenPedido.getOrdenPedidoFormulario().getTipoOp() == 'P') {
                URL = URLPaginacion.OrdenPedido.URL_LISTA_ORDEN_PEDIDO;
            } else {
                URL = URLPaginacion.OrdenPedido.URL_LISTA_ORDEN_PEDIDO;
            }
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

        return URL;
    }

    @Override
    public String actualizar() {
        try {
            OrdenPedido ordenP = bkOrdenPedido.getOrdenPedidoFormulario();
            ordenP.setUsrModificacion(session.getUsuario().getUsuario());
            ordenP.setFecModificacion(new Date());
            for (DetallePedidoOp det1 : bkDetallePedidoOp.getListaDetallePedidoOPEditar()) {
                if (det1.getId() == null) {
                    det1.setIdOrdenPedido(ordenP);
                }
            }
            ordenP.setDetallePedidoOpCollection(bkDetallePedidoOp.getListaDetallePedidoOPEditar());


            servicioOrdenPedido.actualizarOrdenPedido(ordenP);

            mostrarMensaje("Se actualizó la Orden de Producción satisfactoriamente.");

            //URL = mostrarMantenimiento();
            buscarListaOrdenesPedido();
            URL = URLPaginacion.OrdenPedido.URL_LISTA_ORDEN_PEDIDO;

        } catch (ServiceException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
            URL = URLPaginacion.OrdenPedido.URL_FORMULARIO_OP_TELA;
        }
        return URL;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        OrdenPedido ordenP = bkOrdenPedido.getOrdenPedidoSeleccionado();
        ordenP.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        ordenP.setUsrModificacion(session.getUsuario().getUsuario());
        ordenP.setFecModificacion(new Date());
        try {
            servicioOrdenPedido.actualizarOrdenPedido(ordenP);
            buscarListaOrdenesPedido();
            mostrarMensaje("Se elimino la Orden de Producció satisfactoriamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void marcarInicio(DateSelectEvent event) {
        bkOrdenPedido.getOrdenPedidoFormulario().setFechaInicioPedido(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkOrdenPedido.getOrdenPedidoFormulario().setFechaDespachoEstimada(event.getDate());
    }

    public void inicializarValores() {
        try {
            bkOrdenPedido.setListaClientesActivos(servicioCliente.listarClientesActivos());
            FacturaProforma factProdorma = new FacturaProforma();
            factProdorma.setTipoFP(bkOrdenPedido.getOrdenPedidoFormulario().getTipoOp());
            factProdorma.setIdEmpresa(session.getEmpresa());
            bkOrdenPedido.setListaFacturaProformaActiva(servicioFacturaProforma.listarFacturaProformasAprobadosPorTipo(factProdorma));
            bkOrdenPedido.setIgv(servicioIGV.ConseguirIgvPorFecha(new Date()).getMonto().divide(new BigDecimal(100)).doubleValue());

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void buscarFacturaProforma() {
        try {
            FacturaProforma fp = new FacturaProforma();
            fp = servicioFacturaProforma.conseguirFacturaProformaPorId(bkOrdenPedido.getFacturaProformaFormulario().getId());

            if (fp == null) {
                mostrarError("No existe el código, no ha sido aprobada o no pertenece a esta área.");
            } else {
                bkOrdenPedido.getOrdenPedidoFormulario().setIdFacturaProforma(fp);
                //bkDetallePedidoOp.inicializarValores();
                bkOrdenPedido.getOrdenPedidoFormulario().setColeccionNombre(fp.getColeccionNombre());
                bkOrdenPedido.getOrdenPedidoFormulario().setFechaDespachoEstimada(fp.getFechaDelivery());
                bkOrdenPedido.getOrdenPedidoFormulario().setFechaInicioPedido(fp.getFechaFacturaProforma());
                bkOrdenPedido.getOrdenPedidoFormulario().setIdCliente(fp.getIdCliente());
                bkOrdenPedido.getOrdenPedidoFormulario().setTipoMoneda(fp.getIdTipoMoneda().getNombre());
                //bkOrdenPedido.setCodigoCliente(fp.getIdCliente().getCodigoCliente());
                bkOrdenPedido.getOrdenPedidoFormulario().setClienteMarca(fp.getClienteMarca());
                bkOrdenPedido.setCodigoCliente(bkOrdenPedido.getOrdenPedidoFormulario().getClienteMarca().getCodigoCliente());
                /*if(bkOrdenPedido.getOrdenPedidoFormulario().getClienteMarca()!=null && bkOrdenPedido.getOrdenPedidoFormulario().getClienteMarca().equals("")){
                 bkOrdenPedido.setCodigoCliente(servicioCliente.obtenerClientePorRazonSocial(bkOrdenPedido.getOrdenPedidoFormulario().getClienteMarca()).getCodigoCliente());
                
                 }*/
            }
            bkDetallePedidoOp.setListaDetallePedidoFP(new ArrayList<DetallePedidoFp>());
            for (DetallePedidoFp detalleFP : bkOrdenPedido.getOrdenPedidoFormulario().getIdFacturaProforma().getDetallePedidoFpCollection()) {
                if (detalleFP.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    bkDetallePedidoOp.getListaDetallePedidoFP().add(detalleFP);
                }

            }

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void armarDetalleOPPrenda(ComposicionArticulo comp, DetallePedidoFp detalle) throws ServiceException {

        //Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarArticulosPorComposicion(comp);

        for (ComposicionArticulo composicion : servicioComposicionArticulo.buscarArticulosPorComposicion(comp)) {

            DetallePedidoOp detalleOp = new DetallePedidoOp();
            detalleOp.setFecCreacion(new Date());
            detalleOp.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            detalleOp.setUsrCreacion(session.getUsuario().getUsuario());
            detalleOp.setIdArticulo(composicion.getIdArticulo());
            detalleOp.setUnidadMedida(detalle.getUnidadMedida());
            detalleOp.setDetalle(composicion.getIdArticulo().getDetalle());
            detalleOp.setCantidad(BigDecimal.ZERO);
            detalleOp.setPesoUnitario(BigDecimal.ZERO);
            detalleOp.setPesoTotal(BigDecimal.ZERO);
            detalleOp.setPrecioUnitario(detalle.getPrecioUnitario());

            bkDetallePedidoOp.getListaDetallePedidoOP().add(detalleOp);
            bkDetallePedidoOp.getListaDetallePedidoOPEditar().add(detalleOp);

        }

    }

    public void armarDetalleOPTela(ComposicionArticulo comp, DetallePedidoFp detalle) throws ServiceException {
        for (ComposicionArticulo composicion : servicioComposicionArticulo.buscarArticulosPorComposicion(comp)) {
            DetallePedidoOp detalleOp = new DetallePedidoOp();
            detalleOp.setFecCreacion(new Date());
            detalleOp.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            detalleOp.setUsrCreacion(session.getUsuario().getUsuario());
            detalleOp.setIdArticulo(composicion.getIdArticulo());
            detalleOp.setUnidadMedida(detalle.getUnidadMedida());
            detalleOp.setDetalle(composicion.getIdArticulo().getDetalle());
            detalleOp.setCantidad(BigDecimal.ZERO);
            detalleOp.setPesoUnitario(BigDecimal.ZERO);
            detalleOp.setPesoTotal(BigDecimal.ZERO);
            detalleOp.setPrecioUnitario(detalle.getPrecioUnitario());

            bkDetallePedidoOp.getListaDetallePedidoOP().add(detalleOp);
            bkDetallePedidoOp.getListaDetallePedidoOPEditar().add(detalleOp);
            for (ComposicionArticulo composicion1 : servicioComposicionArticulo.buscarArticulosPorComposicion(composicion)) {
                DetallePedidoOp detalleOp1 = new DetallePedidoOp();
                detalleOp1.setFecCreacion(new Date());
                detalleOp1.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                detalleOp1.setUsrCreacion(session.getUsuario().getUsuario());
                detalleOp1.setIdArticulo(composicion1.getIdArticulo());
                detalleOp1.setUnidadMedida(detalle.getUnidadMedida());
                detalleOp1.setDetalle(composicion1.getIdArticulo().getDetalle());
                detalleOp1.setCantidad(BigDecimal.ZERO);
                detalleOp1.setPesoUnitario(BigDecimal.ZERO);
                detalleOp1.setPesoTotal(BigDecimal.ZERO);
                detalleOp1.setPrecioUnitario(detalle.getPrecioUnitario());

                bkDetallePedidoOp.getListaDetallePedidoOP().add(detalleOp1);
                bkDetallePedidoOp.getListaDetallePedidoOPEditar().add(detalleOp1);
            }


        }
    }

    public void generarCodigo() {

        String format = "%1$05d";

        Integer numero = 0;
        try {
            numero = servicioOrdenPedido.buscarCantidadOP(bkOrdenPedido.getOrdenPedidoFormulario());
            System.out.println("numero: " + numero);
            System.out.println("fecha de periodo1: " + bkOrdenPedido.getOrdenPedidoFormulario().getFechaInicioPedido());
            if (numero == 0) {
                System.out.println("fecha de periodo2: " + bkOrdenPedido.getOrdenPedidoFormulario().getFechaInicioPedido());
                bkOrdenPedido.getOrdenPedidoFormulario().setCodigoOrdenPedido(
                        bkOrdenPedido.getCodigoCliente() + "-"
                        + UtilitarioFecha.obtenerAnio(bkOrdenPedido.getOrdenPedidoFormulario().getFechaInicioPedido()) + "-00001");

            } else {
                numero++;
                System.out.println("numero2: " + numero);
                System.out.println("fecha de periodo3: " + bkOrdenPedido.getOrdenPedidoFormulario().getFechaInicioPedido());
                bkOrdenPedido.getOrdenPedidoFormulario().setCodigoOrdenPedido(
                        bkOrdenPedido.getCodigoCliente() + "-"
                        + UtilitarioFecha.obtenerAnio(bkOrdenPedido.getOrdenPedidoFormulario().getFechaInicioPedido()) + "-" + String.format(format, numero));

            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }


    }

    public void generarCodigoAnterior() {

        CorrelativoDocumento correlativo = new CorrelativoDocumento();
        correlativo.setAnio(UtilitarioFecha.obtenerAnioActual());

        TipoDocumento tipoDocumento = new TipoDocumento();
        tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_ORDEN_PEDIDO);

        String format = "%1$05d";

        Integer numero = 0;
        try {
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            //correlativo.setIdsede(servicioSede.conseguirSedePorId(1));
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoDocumentoPorAnio(correlativo);
            if (correlativoEncontrado == null) {

                correlativo.setUsrCreacion(session.getUsuario().getUsuario());
                correlativo.setFecCreacion(new Date());
                correlativo.setNumero("00002");
                servicioCorrelativo.guardarCorrelativoDocumento(correlativo);
                bkOrdenPedido.getOrdenPedidoFormulario().setCodigoOrdenPedido(
                        bkOrdenPedido.getCodigoCliente() + "-" + correlativo.getAnio() + "-00001");

            } else {

                correlativo = correlativoEncontrado;
                numero = Integer.parseInt(correlativo.getNumero());
                bkOrdenPedido.getOrdenPedidoFormulario().setCodigoOrdenPedido(
                        bkOrdenPedido.getCodigoCliente() + "-" + correlativo.getAnio() + "-" + String.format(format, numero));
                numero++;
                correlativo.setNumero(String.format(format, numero));
                correlativo.setUsrModificacion(session.getUsuario().getUsuario());
                correlativo.setFecModificacion(new Date());
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativo);

            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }


    }

    public void generarExplosionTela() throws IOException, ServiceException {
        bkOrdenPedido.setOrdenPedidoFormulario(servicioOrdenPedido.conseguirOrdenPedidoPorId(bkOrdenPedido.getOrdenPedidoFormulario().getId()));
        OrdenPedido orden = bkOrdenPedido.getOrdenPedidoFormulario();


        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("Explosion Tela");

        sheet.setAutobreaks(true);
        sheet.setDefaultColumnWidth(20);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        // Create the fonts
        HSSFFont cabFont = wb.createFont();
        cabFont.setColor(HSSFColor.BLUE.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont headerFont = wb.createFont();
        headerFont.setColor(HSSFColor.BROWN.index);
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont header2Font = wb.createFont();
        header2Font.setColor(HSSFColor.BLACK.index);
        header2Font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        header2Font.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont prodFont = wb.createFont();
        prodFont.setColor(HSSFColor.RED.index);
        prodFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        prodFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont dataFont = wb.createFont();
        dataFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("8"));

        // Create the styles
        HSSFCellStyle cellCabStyle = wb.createCellStyle();
        cellCabStyle.setFont(cabFont);
        cellCabStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellHeaderStyle = wb.createCellStyle();
        cellHeaderStyle.setFont(headerFont);
        cellHeaderStyle.setWrapText(true);
        cellHeaderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellHeader2Style = wb.createCellStyle();
        cellHeader2Style.setFont(header2Font);
        cellHeader2Style.setWrapText(true);
        cellHeader2Style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellProdStyle = wb.createCellStyle();
        cellProdStyle.setFont(prodFont);
        cellProdStyle.setWrapText(true);
        cellProdStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellDataStyle = wb.createCellStyle();
        cellDataStyle.setFont(dataFont);
        cellDataStyle.setWrapText(true);

        HSSFCellStyle cellContStyle = wb.createCellStyle();
        cellContStyle.setFont(contFont);
        cellContStyle.setWrapText(true);
        cellContStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);


        HSSFRow rowFechaEmision = sheet.createRow(1);

        HSSFCell cell8a = rowFechaEmision.createCell(0);
        cell8a.setCellValue("FECHA DE EMISION");
        cell8a.setCellStyle(cellCabStyle);

        HSSFCell cell8b = rowFechaEmision.createCell(1);
        cell8b.setCellValue(UtilitarioFecha.formatearFecha(orden.getFechaInicioPedido(), "dd/MM/yyyy"));
        cell8b.setCellStyle(cellDataStyle);

        HSSFRow rowCliente = sheet.createRow(2);

        HSSFCell cell9a = rowCliente.createCell(0);
        cell9a.setCellValue("CLIENTE");
        cell9a.setCellStyle(cellCabStyle);

        HSSFCell cell9b = rowCliente.createCell(1);
        cell9b.setCellValue(orden.getIdCliente().getRazonSocial());
        cell9b.setCellStyle(cellDataStyle);

        HSSFRow rowRuc = sheet.createRow(3);

        HSSFCell cell10a = rowRuc.createCell(0);
        cell10a.setCellValue("RUC");
        cell10a.setCellStyle(cellCabStyle);

        HSSFCell cell10b = rowRuc.createCell(1);
        cell10b.setCellValue(orden.getIdCliente().getNumeroDocumento());
        cell10b.setCellStyle(cellDataStyle);

        /*HSSFRow rowDirecccion = sheet.createRow(4);

         HSSFCell cell11a = rowDirecccion.createCell(0);
         cell11a.setCellValue("DIRECCION");
         cell11a.setCellStyle(cellCabStyle);

         HSSFCell cell11b = rowDirecccion.createCell(1);
         cell11b.setCellValue(orden.getIdCliente().getDireccionLegal() + " " + orden.getIdCliente().getDescUbicacion());
         cell11b.setCellStyle(cellDataStyle);*/

        HSSFRow rowFechaEntrega = sheet.createRow(4);

        HSSFCell cell12a = rowFechaEntrega.createCell(0);
        cell12a.setCellValue("FECHA DE ENTREGA");
        cell12a.setCellStyle(cellCabStyle);

        HSSFCell cell12b = rowFechaEntrega.createCell(1);
        cell12b.setCellValue(UtilitarioFecha.formatearFecha(orden.getFechaDespachoEstimada(), "dd/MM/yyyy"));
        cell12b.setCellStyle(cellDataStyle);

        //rows
        int rowMer = 6;
        int rowCab = 8;
        int rowCab2 = 9;
        int rowArt = 10;
        int rowArtVal = 11;
        int rowXModelo = -7;
        int rowTotal = 0;
        int cellTotal = 0;
        //cells
        int cellArt = 2;
        int cellComp = 0;
        int i = 0;
        int k = 0;

        boolean estaRowComp = false;
        boolean esModeloDiferente;
        String modeloAnterior = "";

        HSSFRow rowH = null;
        HSSFRow rowC = null;
        HSSFRow rowm = null;




        for (DetallePedidoOp detalle : servicioDetallePedidoOp.listarDetallesPorOpSortModelo(orden.getId())) {
            //detalle = servicioDetallePedidoOp.conseguirDetallePedidoOpPorId(detalle.getId());

            esModeloDiferente = false;
            if (!detalle.getNombreProducto().equals(modeloAnterior)) {
                rowTotal = rowArt;
                cellTotal = cellComp;
                rowXModelo += 7;
                rowMer = 6 + rowXModelo;
                rowCab = 8 + rowXModelo;
                rowCab2 = 9 + rowXModelo;
                rowArt = 10 + rowXModelo;
                rowArtVal = 11 + rowXModelo;

                rowH = sheet.createRow(rowCab);
                rowC = sheet.createRow(rowCab2);
                rowm = sheet.createRow(rowMer);

                HSSFCell cell1Merma = rowm.createCell(2);
                cell1Merma.setCellStyle(cellCabStyle);
                cell1Merma.setCellValue("MERMA(%)");

                //rowXModelo += 4;
                estaRowComp = false;
                esModeloDiferente = true;
            }
            cellComp = 6;
            HSSFRow rowA = sheet.createRow(rowArt);
            HSSFCell cell1Art2 = rowA.createCell(2);
            cell1Art2.setCellStyle(cellProdStyle);
            cell1Art2.setCellValue(detalle.getIdArticulo().getModelo());

            HSSFCell cell1Art3 = rowA.createCell(3);
            cell1Art3.setCellStyle(cellContStyle);
            cell1Art3.setCellValue(detalle.getIdArticulo().getDetalle());

            HSSFCell cell1Art4 = rowA.createCell(4);
            cell1Art4.setCellStyle(cellContStyle);
            cell1Art4.setCellValue(detalle.getCantidad().doubleValue());

            int colForm1 = rowMer + 1;
            String formulaI = "(" + detalle.getCantidad().doubleValue() + "*" + getCharForNumber(5) + colForm1 + ")/100";

            HSSFCell cell1Art5 = rowA.createCell(5);
            cell1Art5.setCellStyle(cellContStyle);
            cell1Art5.setCellType(HSSFCell.CELL_TYPE_FORMULA);
            cell1Art5.setCellFormula(formulaI);

            /*HSSFCell cell1Art5 = rowA.createCell(5);
             cell1Art5.setCellStyle(cellContStyle);
             cell1Art5.setCellValue(detalle.getCantidad().doubleValue());*/

            ComposicionArticulo composicion = new ComposicionArticulo();
            composicion.setIdArticulo(detalle.getIdArticulo());
            Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);

            if (!estaRowComp) {
                HSSFCell cellCab2 = rowC.createCell(2);
                cellCab2.setCellStyle(cellHeader2Style);
                cellCab2.setCellValue("DESCRIPCION");

                HSSFCell cellCab3 = rowC.createCell(3);
                cellCab3.setCellStyle(cellHeader2Style);
                cellCab3.setCellValue("COLOR");

                HSSFCell cellCab4 = rowC.createCell(4);
                cellCab4.setCellStyle(cellHeader2Style);
                cellCab4.setCellValue("CANT. PEDIDO");

                HSSFCell cellCab5 = rowC.createCell(5);
                cellCab5.setCellStyle(cellHeader2Style);
                cellCab5.setCellValue("PEDIDO DE TELA ACABADA");

                HSSFCell cellCH = rowH.createCell(5);
                cellCH.setCellStyle(cellHeaderStyle);
                cellCH.setCellValue(detalle.getIdArticulo().getNombreComercial());

                HSSFCell cell1MermaV = rowm.createCell(5);
                cell1MermaV.setCellStyle(cellDataStyle);
                cell1MermaV.setCellValue(100);
            }

            Iterator itr = listaComposicion.iterator();
            while (itr.hasNext()) {

                ComposicionArticulo comp = (ComposicionArticulo) itr.next();

                if (!estaRowComp) {
                    HSSFCell cellCH = rowH.createCell(cellComp);
                    cellCH.setCellStyle(cellHeaderStyle);
                    cellCH.setCellValue(comp.getIdArticuloComp().getNombreComercial());

                    HSSFCell cell1MermaV = rowm.createCell(cellComp);
                    cell1MermaV.setCellStyle(cellDataStyle);
                    cell1MermaV.setCellValue(100);

                    HSSFCell cellCab4 = rowC.createCell(cellComp);
                    cellCab4.setCellStyle(cellHeader2Style);
                    cellCab4.setCellValue(comp.getTipo());
                    if (comp.getTipo().equals("%")) {
                        cellCab4.setCellValue("KG");
                    }



                }

                Double valor = comp.getCantidad().multiply(detalle.getCantidad()).doubleValue();
                if (comp.getTipo().equals("%")) {
                    valor = valor / 100;
                }
                String currentCol = getCharForNumber(cellComp);
                int colForm = rowMer + 1;
                String formula = "(" + valor + "*" + currentCol + colForm + ")/100";

                HSSFCell cellA = rowA.createCell(cellComp);
                cellA.setCellStyle(cellContStyle);
                cellA.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                cellA.setCellFormula(formula);

                //cellA.setCellValue();


                ComposicionArticulo composicion1 = new ComposicionArticulo();

                composicion1.setIdArticulo(comp.getIdArticuloComp());

                Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);
                itr.remove();
                if (listaComposicionAdd.size() > 0) {
                    listaComposicion.addAll(listaComposicionAdd);
                }
                itr = listaComposicion.iterator();
                cellComp++;
            }
            if (i == 0 && bkDetallePedidoOp.getListaDetallePedidoOP().size() > 1) {
                if (bkDetallePedidoOp.getListaDetallePedidoOP().get(1).getNombreProducto().equalsIgnoreCase(detalle.getNombreProducto())) {
                    esModeloDiferente = false;
                }

            }
            System.out.println("rowArt: " + rowArt);
            System.out.println("esModeloDiferente: " + esModeloDiferente);
            System.out.println("estaRowComp: " + estaRowComp);

            if (esModeloDiferente && !estaRowComp) {
                HSSFRow rowS;
                if (i == 0) {
                    rowS = sheet.createRow(rowTotal + 1);
                } else {
                    rowS = sheet.createRow(rowTotal);
                }

                System.out.println("rowTotal: " + rowTotal);
                String formula1, currentColS;
                int comienzo = rowTotal - k;
                for (int j = 5; j < cellTotal; j++) {
                    currentColS = getCharForNumber(j);

                    formula1 = "SUM(" + currentColS + "" + rowTotal + ":" + currentColS + "" + comienzo + ")";

                    HSSFCell cellS = rowS.createCell(j);
                    cellS.setCellStyle(cellDataStyle);
                    cellS.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cellS.setCellFormula(formula1);
                }

                System.out.println("rowXModelo: " + rowXModelo);
                k = 0;
            } else {
                k++;
            }
            System.out.println("----------------------------------");
            i++;

            rowXModelo++;
            rowArt++;
            estaRowComp = true;
            modeloAnterior = detalle.getNombreProducto();


        }

        HSSFRow rowS = sheet.createRow(rowArt);
        String formula1, currentColS;
        for (int j = 5; j < cellComp; j++) {
            currentColS = getCharForNumber(j);
            formula1 = "SUM(" + currentColS + "" + rowArtVal + ":" + currentColS + "" + rowArt + ")";

            HSSFCell cellS = rowS.createCell(j);
            cellS.setCellStyle(cellDataStyle);
            cellS.setCellType(HSSFCell.CELL_TYPE_FORMULA);
            cellS.setCellFormula(formula1);
        }




        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Explosion-" + orden.getCodigoOrdenPedido() + ".xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();
    }

    public void generarExplosionPrenda() throws IOException, ServiceException {
        bkOrdenPedido.setOrdenPedidoFormulario(servicioOrdenPedido.conseguirOrdenPedidoPorId(bkOrdenPedido.getOrdenPedidoFormulario().getId()));
        OrdenPedido orden = bkOrdenPedido.getOrdenPedidoFormulario();
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("Explosion Tela");

        sheet.setAutobreaks(true);
        sheet.setDefaultColumnWidth(20);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        // Create the fonts
        HSSFFont cabFont = wb.createFont();
        cabFont.setColor(HSSFColor.BLUE.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont headerFont = wb.createFont();
        headerFont.setColor(HSSFColor.BROWN.index);
        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headerFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont header2Font = wb.createFont();
        header2Font.setColor(HSSFColor.BLACK.index);
        header2Font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        header2Font.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont prodFont = wb.createFont();
        prodFont.setColor(HSSFColor.RED.index);
        prodFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        prodFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont dataFont = wb.createFont();
        dataFont.setFontHeightInPoints(Short.valueOf("8"));

        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("8"));

        // Create the styles
        HSSFCellStyle cellCabStyle = wb.createCellStyle();
        cellCabStyle.setFont(cabFont);
        cellCabStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellCabStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellHeaderStyle = wb.createCellStyle();
        cellHeaderStyle.setFont(headerFont);
        cellHeaderStyle.setWrapText(true);
        cellHeaderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellHeaderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellHeader2Style = wb.createCellStyle();
        cellHeader2Style.setFont(header2Font);
        cellHeader2Style.setWrapText(true);
        cellHeader2Style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellHeader2Style.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellProdStyle = wb.createCellStyle();
        cellProdStyle.setFont(prodFont);
        cellProdStyle.setWrapText(true);
        cellProdStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellProdStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle cellDataStyle = wb.createCellStyle();
        cellDataStyle.setFont(dataFont);
        cellDataStyle.setWrapText(true);

        HSSFCellStyle cellContStyle = wb.createCellStyle();
        cellContStyle.setFont(contFont);
        cellContStyle.setWrapText(true);
        cellContStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellContStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);


        HSSFRow rowFechaEmision = sheet.createRow(1);

        HSSFCell cell8a = rowFechaEmision.createCell(0);
        cell8a.setCellValue("FECHA DE EMISION");
        cell8a.setCellStyle(cellCabStyle);

        HSSFCell cell8b = rowFechaEmision.createCell(1);
        cell8b.setCellValue(UtilitarioFecha.formatearFecha(orden.getFechaInicioPedido(), "dd/MM/yyyy"));
        cell8b.setCellStyle(cellDataStyle);

        HSSFRow rowCliente = sheet.createRow(2);

        HSSFCell cell9a = rowCliente.createCell(0);
        cell9a.setCellValue("CLIENTE");
        cell9a.setCellStyle(cellCabStyle);

        HSSFCell cell9b = rowCliente.createCell(1);
        cell9b.setCellValue(orden.getIdCliente().getRazonSocial());
        cell9b.setCellStyle(cellDataStyle);

        HSSFRow rowRuc = sheet.createRow(3);

        HSSFCell cell10a = rowRuc.createCell(0);
        cell10a.setCellValue("RUC");
        cell10a.setCellStyle(cellCabStyle);

        HSSFCell cell10b = rowRuc.createCell(1);
        cell10b.setCellValue(orden.getIdCliente().getNumeroDocumento());
        cell10b.setCellStyle(cellDataStyle);

        /*HSSFRow rowDirecccion = sheet.createRow(4);

         HSSFCell cell11a = rowDirecccion.createCell(0);
         cell11a.setCellValue("DIRECCION");
         cell11a.setCellStyle(cellCabStyle);

         HSSFCell cell11b = rowDirecccion.createCell(1);
         cell11b.setCellValue(orden.getIdCliente().getDireccionLegal() + " " + orden.getIdCliente().getDescUbicacion());
         cell11b.setCellStyle(cellDataStyle);*/

        HSSFRow rowFechaEntrega = sheet.createRow(4);

        HSSFCell cell12a = rowFechaEntrega.createCell(0);
        cell12a.setCellValue("FECHA DE ENTREGA");
        cell12a.setCellStyle(cellCabStyle);

        HSSFCell cell12b = rowFechaEntrega.createCell(1);
        cell12b.setCellValue(UtilitarioFecha.formatearFecha(orden.getFechaDespachoEstimada(), "dd/MM/yyyy"));
        cell12b.setCellStyle(cellDataStyle);

        //rows
        int rowMer = 6;
        int rowCab = 8;
        int rowCab2 = 9;
        int rowArt = 10;
        int rowArtVal = 11;
        int rowXModelo = -7;
        int rowTotal = 0;
        int cellTotal = 0;


        int iterador = 0;

        //cells
        int cellArt = 2;
        int cellComp = 0;
        int i = 0;
        int k = 0;

        boolean estaRowComp = false;
        boolean esModeloDiferente;
        String modeloAnterior = "";

        HSSFRow rowH = null;
        HSSFRow rowC = null;
        HSSFRow rowm = null;





        for (DetallePedidoOp detalle : bkDetallePedidoOp.getListaDetallePedidoOPEditar()) {
            detalle = servicioDetallePedidoOp.conseguirDetallePedidoOpPorId(detalle.getId());
            cellComp = 5;
            iterador = 0;
            esModeloDiferente = false;
            if (!detalle.getNombreProducto().equals(modeloAnterior)) {
                rowTotal = rowArt;
                cellTotal = cellComp;
                rowXModelo += 7;
                rowMer = 6 + rowXModelo;
                rowCab = 8 + rowXModelo;
                rowCab2 = 9 + rowXModelo;
                rowArt = 10 + rowXModelo;
                rowArtVal = 11 + rowXModelo;

                rowH = sheet.createRow(rowCab);
                rowC = sheet.createRow(rowCab2);
                rowm = sheet.createRow(rowMer);

                HSSFCell cell1Merma = rowm.createCell(2);
                cell1Merma.setCellStyle(cellCabStyle);
                cell1Merma.setCellValue("MERMA (%)");

                //rowXModelo += 4;
                esModeloDiferente = true;
                estaRowComp = false;

            }
            HSSFRow rowA = sheet.createRow(rowArt);

            HSSFCell cell1Art2 = rowA.createCell(2);
            cell1Art2.setCellStyle(cellProdStyle);
            cell1Art2.setCellValue(detalle.getIdArticulo().getModelo());

            HSSFCell cell1Art3 = rowA.createCell(3);
            cell1Art3.setCellStyle(cellContStyle);
            cell1Art3.setCellValue(detalle.getIdArticulo().getDetalle());

            HSSFCell cell1Art4 = rowA.createCell(4);
            cell1Art4.setCellStyle(cellContStyle);
            cell1Art4.setCellValue(detalle.getCantidad().doubleValue());

            ComposicionArticulo composicion = new ComposicionArticulo();
            composicion.setIdArticulo(detalle.getIdArticulo());
            Collection<ComposicionArticulo> listaComposicion = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion);

            if (!estaRowComp) {
                HSSFCell cellCab2 = rowC.createCell(2);
                cellCab2.setCellStyle(cellHeader2Style);
                cellCab2.setCellValue("DESCRIPCION");

                HSSFCell cellCab3 = rowC.createCell(3);
                cellCab3.setCellStyle(cellHeader2Style);
                cellCab3.setCellValue("TALLA");

                HSSFCell cellCab4 = rowC.createCell(4);
                cellCab4.setCellStyle(cellHeader2Style);
                cellCab4.setCellValue("CANT. PEDIDO");


            }

            Iterator itr = listaComposicion.iterator();
            while (itr.hasNext()) {

                ComposicionArticulo comp = (ComposicionArticulo) itr.next();

                if (!estaRowComp) {
                    HSSFCell cellCH = rowH.createCell(cellComp);
                    cellCH.setCellStyle(cellHeaderStyle);
                    cellCH.setCellValue(comp.getIdArticuloComp().getNombreComercial());

                    HSSFCell cell1MermaV = rowm.createCell(cellComp);
                    cell1MermaV.setCellStyle(cellDataStyle);
                    cell1MermaV.setCellValue(100);

                    HSSFCell cellCab4 = rowC.createCell(cellComp);
                    cellCab4.setCellStyle(cellHeader2Style);
                    //cellCab4.setCellValue(comp.getTipo());
                    cellCab4.setCellValue(comp.getTipo());


                }

                Double valor = comp.getCantidad().multiply(detalle.getCantidad()).doubleValue();
                String currentCol = getCharForNumber(cellComp);
                int colForm = rowMer + 1;
                String formula = "(" + valor + "*" + currentCol + "" + colForm + ")/100";

                HSSFCell cellA = rowA.createCell(cellComp);
                cellA.setCellStyle(cellContStyle);
                cellA.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                cellA.setCellFormula(formula);

                //cellA.setCellValue();


                ComposicionArticulo composicion1 = new ComposicionArticulo();

                composicion1.setIdArticulo(comp.getIdArticuloComp());
                if (iterador == 0) {
                    Collection<ComposicionArticulo> listaComposicionAdd = servicioComposicionArticulo.buscarComposicionPorArticulo(composicion1);

                    itr.remove();
                    if (listaComposicionAdd.size() > 0) {
                        listaComposicion.addAll(listaComposicionAdd);
                    }
                    itr = listaComposicion.iterator();
                    iterador++;
                }
                cellComp++;
            }


            if (i == 0 && bkDetallePedidoOp.getListaDetallePedidoOP().size() > 1) {
                if (bkDetallePedidoOp.getListaDetallePedidoOP().get(1).getNombreProducto().equalsIgnoreCase(detalle.getNombreProducto())) {
                    esModeloDiferente = false;
                }

            }
            if (esModeloDiferente && !estaRowComp) {

                HSSFRow rowS;
                if (i == 0) {
                    rowS = sheet.createRow(rowTotal + 1);
                } else {
                    rowS = sheet.createRow(rowTotal);
                }
                String formula1, currentColS;
                int comienzo = rowTotal - k;
                for (int j = 5; j < cellComp; j++) {
                    currentColS = getCharForNumber(j);

                    formula1 = "SUM(" + currentColS + "" + rowTotal + ":" + currentColS + "" + comienzo + ")";

                    HSSFCell cellS = rowS.createCell(j);
                    cellS.setCellStyle(cellDataStyle);
                    cellS.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cellS.setCellFormula(formula1);
                }

                k = 0;
            } else {
                k++;
            }
            i++;

            rowXModelo++;
            rowArt++;
            estaRowComp = true;
            modeloAnterior = detalle.getNombreProducto();


        }

        HSSFRow rowS = sheet.createRow(rowArt);
        String formula1, currentColS;
        for (int j = 5; j < cellComp; j++) {
            currentColS = getCharForNumber(j);
            formula1 = "SUM(" + currentColS + "" + rowArtVal + ":" + currentColS + "" + rowArt + ")";

            HSSFCell cellS = rowS.createCell(j);
            cellS.setCellStyle(cellDataStyle);
            cellS.setCellType(HSSFCell.CELL_TYPE_FORMULA);
            cellS.setCellFormula(formula1);
        }

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"Explosion-" + orden.getCodigoOrdenPedido() + ".xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();
    }

    private String getCharForNumber(int i) {
        char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        if (i > 25) {
            return null;
        }
        return Character.toString(alphabet[i]);
    }

    @Override
    public String ver() {
        editar();

        if (bkOrdenPedido.getOrdenPedidoFormulario().getTipoOp() == 'P') {
            URL = URLPaginacion.OrdenPedido.URL_VER_OP_PRENDA;
        } else {

            Collections.sort(bkDetallePedidoOp.getListaDetallePedidoOP(), new Comparator() {
                public int compare(Object o1, Object o2) {
                    DetallePedidoOp e1 = (DetallePedidoOp) o1;
                    DetallePedidoOp e2 = (DetallePedidoOp) o2;
                    int resultado = e1.getDetalle().trim().compareToIgnoreCase(e2.getDetalle().trim());
                    /*System.out.println("detalle 1: " + e1.getDetalle());
                     System.out.println("detalle 2: " + e2.getDetalle());
                     System.out.println("resultado 1: " + resultado);*/
                    if (resultado != 0) {
                        return resultado;
                    }
                    resultado = e1.getNombreProducto().trim().compareToIgnoreCase(e2.getNombreProducto().trim());
                    /*System.out.println("resultado 2: " + resultado);
                     System.out.println("nom producto 1: " + e1.getNombreProducto());
                     System.out.println("nom producto 2: " + e2.getNombreProducto());*/
                    if (resultado != 0) {
                        return resultado;
                    }
                    return resultado;
                    /*if (e1.getDetalle().compareToIgnoreCase(e2.getDetalle()) == 0) {
                     if (e1.getNombreProducto().compareToIgnoreCase(e2.getNombreProducto()) != 0) {
                     return e1.getNombreProducto().compareToIgnoreCase(e2.getNombreProducto());
                     }else{
                     return 0;
                     }
                     } else {
                     return e1.getDetalle().compareToIgnoreCase(e2.getDetalle());
                     }*/
                }
            });

            int i = bkDetallePedidoOp.getListaDetallePedidoOP().size();
            int count = 1;
            bkDetallePedidoOp.setNumFilasTotalAcum(0);
            while (i > 0) {
                if (count == 1) {
                    i = i - 33;
                    bkDetallePedidoOp.getNumTablas().add(33);
                } else {
                    i = i - 50;
                    bkDetallePedidoOp.getNumTablas().add(50);

                }
                count++;

            }
            System.out.println("numero de tablas es : " + bkDetallePedidoOp.getNumTablas().size());
            System.out.println("lista de tablas : " + bkDetallePedidoOp.getNumTablas());
            URL = URLPaginacion.OrdenPedido.URL_VER_OP_TELA;
        }

        return URL;
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.OrdenPedido.URL_LISTA_ORDEN_PEDIDO;
        //return mostrarMantenimiento();
    }

    public String getTipoOrdenPedido() {
        return tipoOrdenPedido;
    }

    public void setTipoOrdenPedido(String tipoOrdenPedido) {
        this.tipoOrdenPedido = tipoOrdenPedido;
    }

    public void elegirClienteMarca() {
        if (bkOrdenPedido.getClienteMarca() == null) {
            System.out.println("entro null");
            bkOrdenPedido.setCodigoCliente(bkOrdenPedido.getOrdenPedidoFormulario().getIdCliente().getCodigoCliente());

        } else {
            System.out.println("entro si hay");
            bkOrdenPedido.setCodigoCliente(bkOrdenPedido.getClienteMarca().getCodigoCliente());
        }

        System.out.println("codigo cliente: " + bkOrdenPedido.getCodigoCliente());

    }

    public void sortListener(SortEvent event) {
        /*this.caseListSortBy = event.getSortColumn();
         if (sortEvent.isAscending()){
         this.caseListSortOrder = "ASCENDING";
         }else{
         this.caseListSortOrder = "DESCENDING";   */
    }

    public List<DetallePedidoOp> buscarListaMostrar(int numTabla) {
        System.out.println("el numero de tabla actual: " + numTabla);
        List<DetallePedidoOp> lista = new ArrayList<DetallePedidoOp>();
        //numTabla-=1;
        int j = 0;
        for (int k = 0; k < numTabla; k++) {
            j += bkDetallePedidoOp.getNumTablas().get(k);
        }
        //int j = numTabla*bkDetallePedidoOp.getNumTablas().get(numTabla);
        for (int i = j; i < j + bkDetallePedidoOp.getNumTablas().get(numTabla); i++) {
            if (i < bkDetallePedidoOp.getListaDetallePedidoOP().size()) {
                lista.add(bkDetallePedidoOp.getListaDetallePedidoOP().get(i));

            } else {
                break;
            }

        }

        /*if(numTabla == 0){
            
         }else{
        
         }*/
        return lista;
    }

    public int sumarUno() {
        bkDetallePedidoOp.setNumFilasTotalAcum(bkDetallePedidoOp.getNumFilasTotalAcum() + 1);
        return bkDetallePedidoOp.getNumFilasTotalAcum();
    }

    public boolean isRendered(int count) {
        count++;
        if (count == bkDetallePedidoOp.getNumTablas().size()) {
            return true;
        } else {
            return false;
        }
    }
}
